home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World 2008 September
/
PCWorld_2008-09_cd.bin
/
v cisle
/
sadanastroju
/
lightning-0.8-tb-win.xpi
/
js
/
calDateTimeFormatter.js
< prev
next >
Wrap
Text File
|
2008-01-16
|
11KB
|
275 lines
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is OEone Calendar Code, released October 31st, 2001.
*
* The Initial Developer of the Original Code is
* OEone Corporation.
* Portions created by the Initial Developer are Copyright (C) 2001
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Garth Smedley <garths@oeone.com>
* Mike Potter <mikep@oeone.com>
* Eric Belhaire <belhaire@ief.u-psud.fr>
* Michiel van Leeuwen <mvl@exedo.nl>
* Matthew Willis <lilmatt@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
const nsIScriptableDateFormat = Components.interfaces.nsIScriptableDateFormat;
function calDateTimeFormatter() {
var strBundleService =
Components.classes["@mozilla.org/intl/stringbundle;1"]
.getService(Components.interfaces.nsIStringBundleService);
this.mDateStringBundle = strBundleService.createBundle("chrome://calendar/locale/dateFormat.properties");
this.mDateService =
Components.classes["@mozilla.org/intl/scriptabledateformat;1"]
.getService(nsIScriptableDateFormat);
// Do does the month or day come first in this locale?
this.mMonthFirst = false;
// If LONG FORMATTED DATE is same as short formatted date,
// then OS has poor extended/long date config, so use workaround.
this.mUseLongDateService = true;
var probeDate =
Components.classes["@mozilla.org/calendar/datetime;1"]
.createInstance(Components.interfaces.calIDateTime);
probeDate.timezone = UTC();
probeDate.year = 2002;
probeDate.month = 3;
probeDate.day = 5;
try {
// We're try/catching the calls to nsScriptableDateFormat since it's
// outside this module. We're also reusing probeDate rather than
// creating 3 discrete calDateTimes for performance.
var probeStringA = this.formatDateShort(probeDate);
var longProbeString = this.formatDateLong(probeDate);
probeDate.month = 4;
var probeStringB = this.formatDateShort(probeDate);
probeDate.month = 3;
probeDate.day = 6;
var probeStringC = this.formatDateShort(probeDate);
// Compare the index of the first differing character between
// probeStringA to probeStringB and probeStringA to probeStringC.
for (var i=0; i < probeStringA.length ; i++) {
if (probeStringA[i] != probeStringB[i]) {
this.mMonthFirst = true;
break;
} else if (probeStringA[i] != probeStringC[i]) {
this.mMonthFirst = false;
break;
}
}
// On Unix extended/long date format may be created using %Ex instead
// of %x. Some systems may not support it and return "Ex" or same as
// short string. In that case, don't use long date service, use a
// workaround hack instead.
if (longProbeString == null ||
longProbeString.length < 4 ||
longProbeString == probeStringA)
this.mUseLongDateService = false;
} catch (e) {
this.mUseLongDateService = false;
}
}
calDateTimeFormatter.prototype.QueryInterface =
function QueryInterface(aIID) {
if (!aIID.equals(Components.interfaces.nsISupports) &&
!aIID.equals(Components.interfaces.calIDateTimeFormatter)) {
throw Components.results.NS_ERROR_NO_INTERFACE;
}
return this;
};
calDateTimeFormatter.prototype.formatDate =
function formatDate(aDate) {
// Format the date using user's format preference (long or short)
var format;
var prefBranch = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);
try {
format = prefBranch.getIntPref("calendar.date.format");
} catch(e) {
format = 0;
}
if (format == 0)
return this.formatDateLong(aDate);
else
return this.formatDateShort(aDate);
};
calDateTimeFormatter.prototype.formatDateShort =
function formatDateShort(aDate) {
return this.mDateService.FormatDate("",
nsIScriptableDateFormat.dateFormatShort,
aDate.year,
aDate.month + 1,
aDate.day);
};
calDateTimeFormatter.prototype.formatDateLong =
function formatDateLong(aDate) {
if (this.mUseLongDateService) {
return this.mDateService.FormatDate("",
nsIScriptableDateFormat.dateFormatLong,
aDate.year,
aDate.month + 1,
aDate.day);
} else {
// HACK We are probably on Linux and want a string in long format.
// dateService.dateFormatLong on Linux may return a short string, so
// build our own.
return this.shortDayName(aDate.weekday) + " " +
aDate.day + " " +
this.shortMonthName(aDate.month) + " " +
aDate.year;
}
};
calDateTimeFormatter.prototype.formatDateWithoutYear =
function formatDateWithoutYear(aDate) {
// Doing this the hard way, because nsIScriptableDateFormat doesn't
// have a way to not include the year.
if (this.mMonthFirst) {
return this.shortMonthName(aDate.month) + " " + aDate.day;
} else {
return aDate.day + " " + this.shortMonthName(aDate.month);
}
};
calDateTimeFormatter.prototype.formatTime =
function formatTime(aDate) {
if (aDate.isDate)
return this.mDateStringBundle.GetStringFromName("AllDay");
return this.mDateService.FormatTime("",
nsIScriptableDateFormat.timeFormatNoSeconds,
aDate.hour,
aDate.minute,
0);
};
calDateTimeFormatter.prototype.formatDateTime =
function formatDateTime(aDate) {
var formattedDate = this.formatDate(aDate);
var formattedTime = this.formatTime(aDate);
var timeBeforeDate;
var prefBranch = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);
try {
timeBeforeDate = prefBranch.getBoolPref("calendar.date.formatTimeBeforeDate");
} catch(e) {
timeBeforeDate = 0;
}
if (timeBeforeDate)
return formattedTime+" "+formattedDate;
else
return formattedDate+" "+formattedTime;
};
calDateTimeFormatter.prototype.formatInterval =
function formatInterval(aStartDate, aEndDate, aStartString, aEndString) {
// make sure start and end use the same timezone when formatting intervals:
var endDate = aEndDate.getInTimezone(aStartDate.timezone);
// EndDate is exclusive. For all-day events, we ened to substract one day,
// to get into a format that's understandable.
if (aStartDate.isDate) {
endDate.day -= 1;
}
var testdate = aStartDate.clone();
testdate.isDate = true;
var sameDay = (testdate.compare(endDate) == 0);
if (aStartDate.isDate) {
// All-day interval, so we should leave out the time part
if (sameDay) {
// Start and end on the same day: only give return the start
// date.
// "5 Jan 2006"
aStartString.value = this.formatDate(aStartDate);
aEndString.value = "";
} else {
// Spanning multiple days, return both dates
// "5 Jan 2006 - 7 Jan 2006"
aStartString.value = this.formatDate(aStartDate);
aEndString.value = this.formatDate(endDate);
}
} else {
// non-allday, so need to return date and time
if (sameDay) {
// End is on the same day as start, so we can leave out the
// end date (but still include end time)
// "5 Jan 2006 13:00 - 17:00"
aStartString.value = this.formatDate(aStartDate)+" "+this.formatTime(aStartDate);
aEndString.value = this.formatTime(endDate);
} else {
// Spanning multiple days, so need to include date and time
// for start and end
// "5 Jan 2006 13:00 - 7 Jan 2006 9:00"
aStartString.value = this.formatDateTime(aStartDate);
aEndString.value = this.formatDateTime(endDate);
}
}
return 1;
};
calDateTimeFormatter.prototype.monthName =
function monthName(aMonthIndex) {
var oneBasedMonthIndex = aMonthIndex + 1;
return this.mDateStringBundle.GetStringFromName("month." + oneBasedMonthIndex + ".name" );
};
calDateTimeFormatter.prototype.shortMonthName =
function shortMonthName(aMonthIndex) {
var oneBasedMonthIndex = aMonthIndex + 1;
return this.mDateStringBundle.GetStringFromName("month." + oneBasedMonthIndex + ".Mmm" );
};
calDateTimeFormatter.prototype.dayName =
function monthName(aDayIndex) {
var oneBasedDayIndex = aDayIndex + 1;
return this.mDateStringBundle.GetStringFromName("day." + oneBasedDayIndex + ".name" );
};
calDateTimeFormatter.prototype.shortDayName =
function shortDayName(aDayIndex) {
var oneBasedDayIndex = aDayIndex + 1;
return this.mDateStringBundle.GetStringFromName("day." + oneBasedDayIndex + ".Mmm" );
};